/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Dao;

import Model.UsuarioModel;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
 *
 * @author Diego
 */
public class UsuarioDao {

    public static final int cNavPrimeiro = 0;
    public static final int cNavAnterior = 1;
    public static final int cNavProximo = 2;
    public static final int cNavUltimo = 3;


    public static void Salvar(UsuarioModel usuario) {
        Connection conexao= FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;

        String sql = "insert into usuario (CODIGO_USU, NOME_USU, LOGIN_USU, SENHA_USU, DATACADASTRO_USU)"
                + "values(?,?,?,?,?);";
        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, usuario.getCodUsuario());
            insereSt.setString(2, usuario.getNome());

            insereSt.setString(3, usuario.getLogin());
            insereSt.setString(4, usuario.getSenha());
            if (usuario.getDataCadastro() == null) {
                //insereSt.setDate(5, new java.sql.Date(new java.util.Date().getTime()));
                insereSt.setTimestamp(5, new java.sql.Timestamp(new java.util.Date().getTime()));
            } else {
                insereSt.setTimestamp(5, usuario.getDataCadastro());
            }

            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
    }

    public static void Alterar(UsuarioModel usuario) {

        Connection conexao=FabricaConexao.GeraConexao();
        PreparedStatement insereSt = null;
        String sql = "update usuario set CODIGO_USU=?, NOME_USU=?, LOGIN_USU=?, SENHA_USU=?, DATACADASTRO_USU=? where CODIGO_USU=" + usuario.getCodUsuario();

        try {
            insereSt = conexao.prepareStatement(sql);
            insereSt.setInt(1, usuario.getCodUsuario());
            insereSt.setString(2, usuario.getNome());
            insereSt.setString(3, usuario.getLogin());
            insereSt.setString(4, usuario.getSenha());
            insereSt.setTimestamp(5, usuario.getDataCadastro());
            insereSt.executeUpdate();
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                insereSt.close();
                conexao.close();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

    }

   
    public static UsuarioModel RecuperarUsuario(int Cod) {

        Connection conexao= FabricaConexao.GeraConexao();
        UsuarioModel usuarioRecuperado = new UsuarioModel();
        Statement consulta = null;
        ResultSet resultado = null;

        String sql = "select * from usuario where CODIGO_USU=" + Cod;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(sql);
            resultado.next();

            usuarioRecuperado.setCodUsuario(resultado.getInt("CODIGO_USU"));
            usuarioRecuperado.setNome(resultado.getString("NOME_USU"));
            usuarioRecuperado.setLogin(resultado.getString("LOGIN_USU"));
            usuarioRecuperado.setSenha(resultado.getString("SENHA_USU"));
            usuarioRecuperado.setDataCadastro(resultado.getTimestamp("DATACADASTRO_USU"));
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }

        return usuarioRecuperado;
    }

    public static List<UsuarioModel> RecuperaUsuarios(String sql) {
        Connection conexao= FabricaConexao.GeraConexao();
        List<UsuarioModel> usu = new ArrayList<UsuarioModel>();
        try {
            Statement objSTM = conexao.createStatement();
            objSTM.executeQuery(sql);
            ResultSet objResultSet = objSTM.getResultSet();
            while (objResultSet.next()) {
                UsuarioModel u = new UsuarioModel();
                String vID = objResultSet.getString("CODIGO_USU");
                String vNome = objResultSet.getString("NOME_USU");
                String vLogin = objResultSet.getString("LOGIN_USU");
                String vSenha = objResultSet.getString("SENHA_USU");
                Timestamp Data = objResultSet.getTimestamp("DATACADASTRO_USU");
                u.setCodUsuario(Integer.parseInt(vID));
                u.setNome(vNome);
                u.setLogin(vLogin);
                u.setSenha(vSenha);
                u.setDataCadastro(Data);
                usu.add(u);
            }
            objResultSet.close();
            objSTM.close();
        } catch (Exception erro) {
            String errorMsg = "Erro ao Recuperar: " + erro.getMessage();
            JOptionPane.showMessageDialog(null, errorMsg, "Mensagem", JOptionPane.ERROR_MESSAGE);
        }
        return usu;
    }

    public static int PegaCodPelaNavegacao (int iopcao, int iCodAtual){
        
        Connection conexao= FabricaConexao.GeraConexao();
        Statement consulta = null;
        ResultSet resultado = null;
        int CodEncontrado = -1;
        try {
            consulta = (Statement) conexao.createStatement();
            resultado = consulta.executeQuery(UsuarioDao.SQLNavegacao( iopcao, iCodAtual));
            resultado.next();
            CodEncontrado= resultado.getInt("COD");
        } catch (SQLException ex) {
            Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                resultado.close();
                conexao.close();
                consulta.close();
            } catch (SQLException ex) {
                Logger.getLogger(UsuarioDao.class.getName()).log(Level.SEVERE, null, ex);
            }

        }
        return CodEncontrado;      
        
        
    }


    public static String SQLNavegacao(int iopcao, int iCodAtual) {
        String sql = "";
        switch (iopcao) {
            case cNavPrimeiro:
                sql = " select min(CODIGO_USU) as COD from usuario ";
                break;
            case cNavAnterior:
                sql = " select max(CODIGO_USU) as COD from usuario where CODIGO_USU <" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavProximo:
                sql = " select min(CODIGO_USU) as COD from usuario where CODIGO_USU >" + String.valueOf(iCodAtual) + " ";
                break;
            case cNavUltimo:
                sql = " select max(CODIGO_USU) as COD from usuario ";
                break;
        }
        return sql;
    }
    public static void Excluir(int CodAtual) {
        FabricaConexao.Excluir(CodAtual, "usuario", "CODIGO_USU");
    }

    public static ArrayList<UsuarioModel> PesquisaObjeto(String NomeCampo, String Valor, boolean EmQualquerParte) {
        String sql = "select * from usuario where " + NomeCampo + " like '";
        if(EmQualquerParte){
            sql=sql + "%";
        }
        sql = sql + Valor + "%'";
        
        return (ArrayList<UsuarioModel>) (List<UsuarioModel>) RecuperaUsuarios(sql);
    }
   
}
